MySQL スレッドプーリング(編集中)
#MySQL
MySQL スレッド(編集中)の話を先に知っておいた後で、ここの章を読んだ方がいい。
MySQLがどういう風にマルチスレッドで並行実行を実施してるのかを先に知っておくと、そのメリデメが見えてきて、このスレッドプーリングの話もわかるようになる。
スレッドプールの概要
やってることを簡単に説明
コネクションに対して、新しいスレッドを生成することなく、元からある指定数のスレッドを使い回す。
全スレッドが使用中の間は、接続自体はキューイングされて待ち状態になる。
以下の課題を解決してる
1. スレッドが多すぎると、高度な並列実行ワークロードで CPU キャッシュがほとんど役に立たなくなります。
2. 並列で実行しているスレッド数が多すぎると、コンテキストスイッチングのオーバーヘッドが高くなります。
3. 並列で実行するトランザクションが多すぎると、リソースの競合が増加する
4. あと、スレッド生成しすぎによるメモリ大量消費も発生しうる(アイドル状態のスレッドもメモリを確保する厄介)
スレッドプールの機能詳細
スレッドグループというスレッドが集まったグループを管理してる。以下のようなイメージ
ThreadGroupA:Thread1a, Thread2a, ...
ThreadGroupB:Thread1b, Thread2b, ...
参考:Aurora MySQL スレッドプールの動作イメージ
スレッドキャッシュとの違い
マジで違いわからんかったが、以下のブログでスッキリした
技術めも » Blog Archive » MariaDBの独自パラメータについて
スレッドキャッシュ
こいつはスレッド生成を制限することはしない。
スレッドキャッシュに使えるフリーのスレッドがあったら使いなさい、無いならスレッドを新規作成しなさい。
これだけ。
スレッドプール
スレッドの生成自体を制限する。
コネクションプーリングとの違い
コネクションプーリングは、アプリケーションからサーバーへの接続確立のオーバーヘッドを無くすためのもの。
毎回接続の度に、スリーウェイハンドシェイクをやってるわけにはいかない。
なので、スレッドプーリングとはまた別の効果がある。
Tips
「スレッド処理モデル」について
ちなみに、MySQLではスレッドの処理モデルが複数あり、その1つがこのスレッドプールになる。
他にあるのは、デフォルト設定の接続:スレッド=1:1のやつ、1スレッドで全接続を対応するやつ(デバッグ用)くらいがある。
この設定はthread_handlingから変更可能。
Q&A
Q.icon
a.icon
参考
MySQL :: MySQL 8.0 リファレンスマニュアル :: A.15 MySQL 8.0 FAQ: MySQL Enterprise Thread Pool
MySQL :: MySQL 8.0 リファレンスマニュアル :: 5.6.3.3 スレッドプール操作
技術めも » Blog Archive » MariaDBの独自パラメータについて
MySQL :: MySQL 8.0 リファレンスマニュアル :: 5.6.3.3 スレッドプール操作